#Environnement de la scène, contient toutes les vaiables 
#nécessaires à l'affichage de la scène et innaccessibles 
#de l'exterieur
.local <- new.env()


#type : 
# p -> points
# s -> spheres

#créer une scène en fonction de certaitnes propriétés 
#(coordonées, couleur, type d'objet à dessiner)
scene.create <- function(x, y=NULL, z=NULL, col='black', radius=NULL, type='p')
{

	.local$x <- x
	.local$y <- y
	.local$z <- z
	.local$col <- col
	.local$radius <- radius
	.local$type <- type
	.local$select <- FALSE

}

#Editer un paramettre de la scène. 
#si repaint == TRUE : redessiner la nouvelle scène
scene.set <- function(x=NULL, y=NULL, z=NULL, col=NULL, radius=NULL, type=NULL, repaint=TRUE)
{
	if(!is.null(x))
		.local$x <- x
	if(!is.null(y))
		.local$y <- y
	if(!is.null(z))
		.local$z <- z
	if(!is.null(col))
		.local$col <- col
	if(!is.null(radius))
		.local$radius <- radius
	if(!is.null(type))
		.local$type <- type

	if(repaint == TRUE)
		scene.draw()
}

#renvoie sous forme de liste les paramètres de la scène
scene.get <- function()
{
	res <- list(coords = list(.local$x,.local$y,.local$z), color = .local$col, size = .local$radius, type = .local$type)
	class(res) <- "Scene"
	return(res) 
}

#ouvrir la fenêtre de visualisation
scene.view <- function(width = 800, height = 600)
{
	if(rgl.cur()==0)
		.local$cur <- open3d(windowRect=c(100,100,500,500))
		#on mémorise pour chaque scène l'id de la 
		#fenêtre à laquelle elle est rattachée
}


#dessiner la scène définié dans scene.create
scene.draw <- function()
{
	if(rgl.cur() != .local$cur) 
		stop(c("The focus must be given on the window ", .local$cur))
	clear3d()
	if(.local$type == 'p')
		points3d(.local$x, .local$y, .local$z, color=.local$col)
	else if(.local$type == 's')
		spheres3d(.local$x, .local$y, .local$z, radius = .local$radius, color=.local$col)	

}

#Activer la selection. Sélection statique uniquement : select3d est un appel bloquant. 
#la fonction ne se termine pas tant qu'aucune selection n'a été faite. 
#La selection est ensuite enregistrée dans l'environnement de la scène pour être 
#accessible par tout le monde.
scene.select <- function()
{
	f <- select3d()
	.local$area <- f(x,y,z)
	print(.local$area)
	#example d'action avec la sélection
	#pop3d()
	#.local$x <- .local$x[area]
	#.local$y <- .local$y[area]
	#.local$z <- .local$z[area]
	#draw.scene()

}


run <- function()
{
	scene.create(rnorm(10),rnorm(10),rnorm(10),radius=runif(10), col=rainbow(10), type="s")
	scene.view()
	scene.draw()
}